package entity

import (
	"sen-golang-study/go_game_study/hero_story_go_server/game_server/internal/domain/user/valueobject"
	"sync"
)

// User 用户聚合根
type User struct {
	userID        uint32
	userName      string
	password      string
	heroAvatar    string
	createTime    int64
	lastLoginTime int64
	curHP         uint32
	moveState     *valueobject.MoveState

	// 组件映射，用于扩展功能
	componentMap *sync.Map
	tempLocker   sync.Mutex
}

// NewUser 创建新用户
func NewUser(userName, password, heroAvatar string, createTime int64) *User {
	return &User{
		userName:      userName,
		password:      password,
		heroAvatar:    heroAvatar,
		createTime:    createTime,
		lastLoginTime: createTime,
		curHP:         1000, // 默认血量
		moveState:     valueobject.NewMoveState(),
		componentMap:  &sync.Map{},
	}
}

// GetUserID 获取用户ID
func (u *User) GetUserID() uint32 {
	return u.userID
}

// SetUserID 设置用户ID
func (u *User) SetUserID(userID uint32) {
	u.userID = userID
}

// GetUserName 获取用户名
func (u *User) GetUserName() string {
	return u.userName
}

// GetPassword 获取密码
func (u *User) GetPassword() string {
	return u.password
}

// GetHeroAvatar 获取英雄头像
func (u *User) GetHeroAvatar() string {
	return u.heroAvatar
}

// SetHeroAvatar 设置英雄头像
func (u *User) SetHeroAvatar(heroAvatar string) {
	u.heroAvatar = heroAvatar
}

// GetCreateTime 获取创建时间
func (u *User) GetCreateTime() int64 {
	return u.createTime
}

// GetLastLoginTime 获取最后登录时间
func (u *User) GetLastLoginTime() int64 {
	return u.lastLoginTime
}

// UpdateLastLoginTime 更新最后登录时间
func (u *User) UpdateLastLoginTime(lastLoginTime int64) {
	u.lastLoginTime = lastLoginTime
}

// GetCurHP 获取当前血量
func (u *User) GetCurHP() uint32 {
	return u.curHP
}

// SetCurHP 设置当前血量
func (u *User) SetCurHP(curHP uint32) {
	u.curHP = curHP
}

// GetMoveState 获取移动状态
func (u *User) GetMoveState() *valueobject.MoveState {
	return u.moveState
}

// SetMoveState 设置移动状态
func (u *User) SetMoveState(moveState *valueobject.MoveState) {
	u.moveState = moveState
}

// GetComponentMap 获取组件映射
func (u *User) GetComponentMap() *sync.Map {
	if u.componentMap != nil {
		return u.componentMap
	}

	u.tempLocker.Lock()
	defer u.tempLocker.Unlock()

	if u.componentMap != nil {
		return u.componentMap
	}

	u.componentMap = &sync.Map{}
	return u.componentMap
}

// IsAlive 判断用户是否存活
func (u *User) IsAlive() bool {
	return u.curHP > 0
}

// TakeDamage 受到伤害
func (u *User) TakeDamage(damage uint32) {
	if damage >= u.curHP {
		u.curHP = 0
	} else {
		u.curHP -= damage
	}
}

// Heal 治疗
func (u *User) Heal(healAmount uint32) {
	u.curHP += healAmount
	// 可以设置最大血量限制
	if u.curHP > 1000 {
		u.curHP = 1000
	}
}